/*
 * Valores da cartas:
 *  00: 4 ♦
 *  01: 4 ♠
 *  02: 4 ♥
 *  03: 4 ♣
 *  04: 5 ♦
 *  05: 5 ♠
 *  06: 5 ♥
 *  07: 5 ♣
 *  08: 6 ♦
 *  09: 6 ♠
 *  10: 6 ♥
 *  11: 6 ♣
 *  12: 7 ♦
 *  13: 7 ♠
 *  14: 7 ♥
 *  15: 7 ♣
 *  16: Dama ♦
 *  17: Dama ♠
 *  18: Dama ♥
 *  19: Dama ♣
 *  20: Valete ♦
 *  21: Valete ♠
 *  22: Valete ♥
 *  23: Valete ♣
 *  24: Rei ♦
 *  25: Rei ♠
 *  26: Rei ♥
 *  27: Rei ♣
 *  28: A ♦
 *  29: A ♠
 *  30: A ♥
 *  31: A ♣
 *  32: 2 ♦
 *  33: 2 ♠
 *  34: 2 ♥
 *  35: 2 ♣
 *  36: 3 ♦
 *  37: 3 ♠
 *  38: 3 ♥
 *  39: 3 ♣
 */

package truco;

import java.util.Random;

/**
 *
 * @author 032072621
 */
public class Baralho {
    //Carta dos jogadores
	private int cartaJogadores[] = new int[13];
    //Quantidade máxima de cartas
    private int quantidadeCartas = 40;
    //Carta que virou
    private int vira;


	public Baralho(){
		for(int i = 0; i < cartaJogadores.length; i++){
			cartaJogadores[i] = 0;
		}
	}

    //Procedure para o sorteio das cartas
	public void SorteiaCartas(){

        /*
         *  Cartas 0..2 São do jogador
         *  Cartas 3..5 São do Computador Adversário 1
         *  Cartas 6..8 São do Computador Parceiro
         *  Cartas 9..11 São do Computador Adversário 2
         *  Carta 12 é o Vira
         */
    
		int numero;
		Random random = new Random();

		for (int j = 0; j < this.cartaJogadores.length; j++)
		{
			//Gera o  número
			numero = random.nextInt(this.quantidadeCartas);

			//Valida o número gerado
			if (ValidaArray(numero)){
					this.cartaJogadores[j] = numero;
			}
			else
			{
					//Se não for um número válido, gera novamente
					j--;
			}
		}

		setVira();
    checaManilha();
	}

    //Procedure para Validar o número gerado
	private boolean ValidaArray(int numero){

		boolean valido = true;
		
		for (int s = 0; s < this.cartaJogadores.length; s++)
		{
			if (numero == this.cartaJogadores[s])
			{
				valido = false;
			}
		}
		
		if (numero == 0){
			valido = false;
		}

        if (numero > this.quantidadeCartas)
        {
            valido = false;
        }

		return valido;
	}

    //Retorna o numero da carta
    private int retornaValor(int numero){
        return numero / 4;
    }

    private int retornaNaipe(int numero){
        return numero % 4;
    }

    //Procedure para setar as manilhas dos jogadores
    private void checaManilha(){
        int valorVira = retornaValor(this.vira);

        for (int i = 0; i < this.cartaJogadores.length; i++){
          /*
           * Se o valor do vira for igual a carta do jogador + 1
           * Seta a carta como Manilha
           *
           * Exemplo: o vira é igual à 6
           * Função retornaValor vai retornar 1 (que vai valer à carta 5)
           * se os jogadores conterem uma carta que a função retornaValor
           * retornar 3 (cartas 9, 10, 11, 12), vai setar essas cartas com
           * seus valores correspondentes
           */
          if (valorVira == retornaValor(this.cartaJogadores[i]) + 1){
            switch (retornaNaipe(this.cartaJogadores[i])){
              //Picafumo
              case 0: this.cartaJogadores[i] = 41;
              //Espadas
              case 1: this.cartaJogadores[i] = 42;
              //Copas
              case 2: this.cartaJogadores[i] = 43;
              //Zap
              case 3: this.cartaJogadores[i] = 44;
            }
          }
        }
    }

	/**
	 * @return the cartaJogadores
	 */
	public int[] getCartaJogadores() {
		return cartaJogadores;
	}

	/**
	 * @param cartaJogadores the cartaJogadores to set
	 */
	public void setCartaJogadores(int[] cartaJogadores) {
		this.cartaJogadores = cartaJogadores;
	}

	private void setCarta(int cartaJogadores, int indice){
		this.cartaJogadores[indice] = cartaJogadores;
	}

	private int getCarta(int indice){
		return cartaJogadores[indice];
	}

    /**
     * @return the vira
     */
    public int getVira() {
        return vira;
    }

    /**
     * @param vira the vira to set
     */
    public void setVira() {
        this.vira = this.cartaJogadores[this.cartaJogadores.length - 1];
    }
}
